package com.shengzhe.ostudent.utils.result;

import com.alibaba.fastjson.JSON;
import com.shengzhe.ostudent.common.exception.OsException;
import com.shengzhe.ostudent.utils.page.PageInfo;
import lombok.Data;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Data
public class R {
    private Boolean success;

    private Integer code;

    private String message;
    /**
     * 结果集，为null不返回
     */
    private Object entity;
    private List<?> entityList;
    /**
     * 分页数据
     */
    private PageInfo<?> pageInfo;

    //设置私有构造方法
    private R() {
    }

    //成功静态方法
    public static R ok() {
        R r = new R();
        r.setSuccess(true);
        r.setCode(200);
        r.setMessage("成功");
        return r;
    }

    /**
     * 将自身作为json数据写出
     *
     * @param res 响应体
     */
    public void writeJson(HttpServletResponse res) {
        res.setContentType("application/json");
        try {
            res.getWriter().write(JSON.toJSONString(this));
        } catch (IOException e) {
            throw new OsException(E.REQUEST_CODE_N9);
        }
    }

    //失败静态方法
    public static R error() {
        return error(new R());
    }

    // 将传入的R对象设置为失败状态
    public static R error(R r) {
        r.setSuccess(false);
        r.setCode(-1);
        r.setMessage("失败");
        r.setEntity(null);
        r.setPageInfo(null);
        r.setEntityList(null);
        return r;
    }

    public R success(Boolean success) {
        this.setSuccess(success);
        return this;
    }

    public R message(String message) {
        this.setMessage(message);
        return this;
    }

    public R code(Integer code) {
        this.setCode(code);
        return this;
    }

    public R entity(Object entity) {
        this.entity = entity;
        return this;
    }

    public R entityList(List<?> entityList) {
        this.entityList = entityList;
        return this;
    }

    public R pageInfo(PageInfo<?> pageInfo) {
        this.pageInfo = pageInfo;
        return this;
    }



    // 返回一个空列表
    public static <T> PageInfo<T> emptyPage() {
        PageInfo<T> page = new PageInfo<>();
        page.setList(new ArrayList<>());
        return page;
    }

    /**
     * 根据传入的参数判断是继续返回正常的数据还是返回错误对象
     *
     * @param isSuccess 是否成功，在本架构中，指本次请求是否成功
     * @return 已经设置过数据的本类，或设置为失败状态的对象
     */
    public void ifSuccess(boolean isSuccess) {
        if (!isSuccess) {
            error(this);
        }
    }


}

